package ru.ncedu.java.tasks;

/**
 * Комментарий к классу пишется после импортов
 *
 * Класс, реализующий парсинг XML-файла
 * @author dalas
 *
 */

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
import java.util.HashMap;

public class Parser {
	// Создаем хеш-карту для хранения идентификаторов и имен классов для операций
	
	
	
	public static HashMap<String, String> parse(String nameOfFile) {          // Возвращаемый тим Map<String, String>
		HashMap<String, String> mapOperation = new HashMap<String, String>(); //Не желательно так Map создавать.
//		Map<String, String> mapOperation = new HashMap<String, String>();     //Либо так
//		Map<String, String> mapOperation = new HashMap<>();                   //Либо так (можно с Java 1.7)
		try {
			
			// Создаем объект файла 
			File fXmlFile = new File(nameOfFile);
			// Создаем объект класса DocumentBuilderFactory
			DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
			// Создаем объект класса DocumentBuilder
			DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
			// Метод возвращает результат парсинга файла
			Document doc = dBuilder.parse(fXmlFile);
			
			doc.getDocumentElement().normalize();                             // Почитай в документации, что такое нормализация документа
		 
			//System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
		 
			NodeList nList = doc.getElementsByTagName("operation");
		 
			//System.out.println("----------------------------");
			
			String key, value;                                                // Не желательно так объявлять переменные
			                                                                  // Каждое объявление должно быть с новой строки
		 
			for (int temp = 0; temp < nList.getLength(); temp++) {
		 
				Node nNode = nList.item(temp);
		 
				//System.out.println("\nCurrent Element :" + nNode.getNodeName());
		 
				if (nNode.getNodeType() == Node.ELEMENT_NODE) {
		 
					Element eElement = (Element) nNode;
		 
					//System.out.println("Operation sign : " + eElement.getAttribute("sign"));
					key = eElement.getAttribute("sign");
					
					//System.out.println("Class : " + eElement.getElementsByTagName("class").item(0).getTextContent());
					value = eElement.getElementsByTagName("class").item(0).getTextContent();
					
					mapOperation.put(key, value);
				}
				
				
				
			}
	    } catch (Exception e) {
		e.printStackTrace();                                                  // Должна быть нормальная обработка исключения
	    }
		return mapOperation;
	}	
}
